// 搞一个 Vue 自己的原型对象出来
// Vue 自己的原型对象.__proto__ ==> Array.prototype
// const vueArrayProto = {}
// vueArrayProto.__proto__ = Array.prototype

import { observeArray } from './index'

// 这个方法的作用：创建一个对象，让这个对象的原型指向第一个实参
export const vueArrayProto = Object.create(Array.prototype)

const methodsToPatch = [
  'push',
  'pop',
  'unshift',
  'shift',
  'splice',
  'sort',
  'reverse',
]

for (const method of methodsToPatch) {
  vueArrayProto[method] = function (...args) {
    // 首先思考：自己的原型对象上的 push 方法，有原来 数组的 push 方法的功能吗？
    // 所以要保留原有的功能，如何做呢？

    // 这个方法是 数组 实例调用的，所以这个 this 就是数组实例

    const result = Array.prototype[method].apply(this, args)

    // 其实我们只想 监听到 数组的 这个方法的调用，去做点小事情
    console.log('监听到调用了数组的', method, '方法')

    // 找出那些新增的元素，给他做 observe
    let inserted

    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }

    if (inserted) {
      observeArray(inserted)
    }

    return result
  }
}
